package com.chentf.behavioral.responsibilitychain.code.demo02;

/**
 * 用来解决问题的抽象类
 */
public abstract class Support {

    /**
     * 解决问题的实例的名字
     */
    private String name;

    /**
     * 要推卸给的对象
     */
    private Support next;

    /**
     * 生成解决问题的实例
     */
    public Support(String name) {
        this.name = name;
    }

    /**
     * 设置要推卸给的对象
     */
    public Support setNext(Support next) {
        this.next = next;
        return next;
    }

    /**
     * 解决问题的步骤
     * 调用了抽象方法resolve，这里属于模版方法模式
     * @param trouble
     */
    public void support(Trouble trouble) {
        if (resolve(trouble)) {
            done(trouble);
        } else if (next != null) {
            // 问题还没有解决，让下一个对象来尝试解决
            next.support( trouble);
        } else {
            // 所有对象都没有办法解决改问题，提示用户，问题没办法解决
            fail( trouble);
        }
    }

    /**
     * 显示字符串
     *
     * @return
     */
    public String toString() {
        return "[" + name + "]";
    }

    /**
     * 解决问题的方法
     * 需要子类去具体实现，如果解决了问题，就返回true
     *
     * @param trouble
     * @return
     */
    protected abstract boolean resolve(Trouble trouble);

    /**
     * 解决
     *
     * @param trouble
     */
    protected void done(Trouble trouble) {
        System.out.println(trouble + " is resolved by " + this + ".");
    }

    /**
     * 未解决
     *
     * @param trouble
     */
    protected void fail(Trouble trouble) {
        System.out.println(trouble + " cannot be resolved.");
    }
}
